package net.aiion.weave.spi.bytecode;

import net.aiion.weave.spi.bytecode.events.AnnotationStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.AttributeBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.ClassEndBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.ClassStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.FieldStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.InnerClassBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.MethodStartBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.OuterClassBytecodeEvent;
import net.aiion.weave.spi.bytecode.events.SourceBytecodeEvent;

public interface BytecodeClassVisitor extends BytecodeVisitor
{
    void visitClassStart(ClassStartBytecodeEvent aClassStartBytecodeEvent);

    void visitSource(SourceBytecodeEvent aSourceBytecodeEvent);

    void visitOuterClass(OuterClassBytecodeEvent aOuterClassBytecodeEvent);

    BytecodeAnnotationVisitor visitAnnotationStart(AnnotationStartBytecodeEvent aAnnotationStartBytecodeEvent);

    void visitAttribute(AttributeBytecodeEvent aAttributeBytecodeEvent);

    void visitInnerClass(InnerClassBytecodeEvent aInnerClassBytecodeEvent);

    BytecodeFieldVisitor visitFieldStart(FieldStartBytecodeEvent aFieldStartBytecodeEvent);

    BytecodeMethodVisitor visitMethodStart(MethodStartBytecodeEvent aMethodStartBytecodeEvent);

    void visitClassEnd(ClassEndBytecodeEvent aClassEndBytecodeEvent);
}
